package com.hifar.test.checktemplate.service.impl;

import java.util.*;

import com.hifar.test.checktemplate.constant.CheckTemplateConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hifar.fw.utils.id.IdUtils;
import com.hifar.plat.officUtil.ExcelTemplateUtil;
import com.hifar.test.checktemplate.mapper.HfEnvCheckTemplateMapper;
import com.hifar.test.checktemplate.pojo.HfEnvCheckTemplate;
import com.hifar.test.checktemplate.pojo.HfEnvCheckTemplateItem;
import com.hifar.test.checktemplate.pojo.VO.HfEnvCheckTemplateVO;
import com.hifar.test.checktemplate.service.IHfEnvCheckTemplateItemService;
import com.hifar.test.checktemplate.service.IHfEnvCheckTemplateService;
import com.hifar.sys.BusiResponse;
import com.hifar.sys.RequestConver;

/**
 * <p>
 * 环境-检查模版 服务实现类
 * </p>
 *
 * @author wangkepeng
 * @since 2024-12-12 13:46:14
 */
@Service
public class HfEnvCheckTemplateServiceImpl extends ServiceImpl<HfEnvCheckTemplateMapper, HfEnvCheckTemplate> implements IHfEnvCheckTemplateService {


    @Autowired
    private IHfEnvCheckTemplateItemService HfEnvCheckTemplateItemService;


    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void saveHfEnvCheckTemplate(HfEnvCheckTemplateVO hfEnvCheckTemplateVO) {
        String type = hfEnvCheckTemplateVO.getType();
        if (Objects.equals(type, CheckTemplateConstant.HANDOVER_TEMPLATE_TYPE)) {
            QueryWrapper<HfEnvCheckTemplate> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda()
                    .eq(HfEnvCheckTemplate::getType, type);
            int count = this.count(queryWrapper);
            Assert.isTrue(count <= 0, "交接班检查模板已添加!无法重复添加!");
        }
        HfEnvCheckTemplate checkTemplate = new HfEnvCheckTemplate();
        BeanUtils.copyProperties(hfEnvCheckTemplateVO, checkTemplate);
        this.save(checkTemplate);
        String id = checkTemplate.getId();
        List<HfEnvCheckTemplateItem> checkTemplateItemList = Optional.ofNullable(hfEnvCheckTemplateVO.getHfEnvCheckTemplateItemList())
                .orElse(new ArrayList<>());
        for (int i = 0; i < checkTemplateItemList.size(); i++) {
            HfEnvCheckTemplateItem checkTemplateItem = checkTemplateItemList.get(i);
            checkTemplateItem.setRowSort(i);
            checkTemplateItem.setCheckTemplateId(id);
        }
        HfEnvCheckTemplateItemService.saveBatch(checkTemplateItemList);
    }


    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public void editHfEnvCheckTemplate(HfEnvCheckTemplateVO hfEnvCheckTemplateVO) {
        String type = hfEnvCheckTemplateVO.getType();
        if (Objects.equals(type, CheckTemplateConstant.HANDOVER_TEMPLATE_TYPE)) {
            QueryWrapper<HfEnvCheckTemplate> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda()
                    .eq(HfEnvCheckTemplate::getType, type)
                    .ne(HfEnvCheckTemplate::getId, hfEnvCheckTemplateVO.getId());
            int count = this.count(queryWrapper);
            Assert.isTrue(count <= 0, "交接班检查模板已添加!无法重复添加!");
        }
        HfEnvCheckTemplate checkTemplate = new HfEnvCheckTemplate();
        BeanUtils.copyProperties(hfEnvCheckTemplateVO, checkTemplate);
        this.updateById(checkTemplate);
        HfEnvCheckTemplateItemService.removeByMainId(hfEnvCheckTemplateVO.getId());
        String id = hfEnvCheckTemplateVO.getId();
        List<HfEnvCheckTemplateItem> checkTemplateItemList = Optional.ofNullable(hfEnvCheckTemplateVO.getHfEnvCheckTemplateItemList())
                .orElse(new ArrayList<>());
        for (int i = 0; i < checkTemplateItemList.size(); i++) {
            HfEnvCheckTemplateItem checkTemplateItem = checkTemplateItemList.get(i);
            checkTemplateItem.setId(null);
            checkTemplateItem.setRowSort(i);
            checkTemplateItem.setCheckTemplateId(id);
        }
        HfEnvCheckTemplateItemService.saveBatch(checkTemplateItemList);
    }


    @Override
    public HfEnvCheckTemplateVO queryHfEnvCheckTemplateVO(String mainId) {
        HfEnvCheckTemplateVO hfEnvCheckTemplateVO = new HfEnvCheckTemplateVO();
        HfEnvCheckTemplate hfEnvCheckTemplate = this.getById(mainId);
        BeanUtils.copyProperties(hfEnvCheckTemplate, hfEnvCheckTemplateVO);
        List<HfEnvCheckTemplateItem> HfEnvCheckTemplateItemList = HfEnvCheckTemplateItemService.list(new QueryWrapper<HfEnvCheckTemplateItem>().eq("CHECK_TEMPLATE_ID", mainId).ne("del_flag", 1));
        hfEnvCheckTemplateVO.setHfEnvCheckTemplateItemList(HfEnvCheckTemplateItemList);
        return hfEnvCheckTemplateVO;
    }

    @Override
    public BusiResponse exportExcel(Map<String, Object> pageInfo) {
        BusiResponse busiResponse = new BusiResponse();
        String ids = (String) pageInfo.get("ids");

        String operationType = (String) pageInfo.get("operationType");

        if (StringUtils.isNotBlank(operationType) && (operationType.equals("template"))) {
            ExcelTemplateUtil.exportExcelTemplate(busiResponse, HfEnvCheckTemplate.class, "导入模板", "环境-检查模版导入数据");
            return busiResponse;
        } else {
            QueryWrapper<HfEnvCheckTemplate> postParam = RequestConver.getPostParam(pageInfo);
            postParam.ne("del_flag", 1);
            postParam.orderByDesc("create_time");
            if (StringUtils.isNotBlank(ids)) {
                postParam.in("id", ids);
            }
            List<HfEnvCheckTemplate> dataList = this.list(postParam);
            if (dataList != null && dataList.size() > 0) {
                ExcelTemplateUtil.exportExcel(busiResponse, dataList, HfEnvCheckTemplate.class, "环境-检查模版数据", "环境-检查模版导出");
            } else {
                ExcelTemplateUtil.exportExcelTemplate(busiResponse, HfEnvCheckTemplate.class, "环境-检查模版数据", "环境-检查模版导出");
            }
            return busiResponse;
        }

    }

    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
    public BusiResponse importExcel(MultipartFile file) throws Exception {
        if (file != null && !file.isEmpty()) {
            List<HfEnvCheckTemplate> importExcel = ExcelTemplateUtil.importExcel(file.getInputStream(), HfEnvCheckTemplate.class);
            List<HfEnvCheckTemplate> importExcelList = new ArrayList<HfEnvCheckTemplate>();
            if (importExcel != null && importExcel.size() > 0) {
                for (HfEnvCheckTemplate bean : importExcel) {
                    bean.setId(IdUtils.uuid32());
                    bean.setDelFlag(0);
                    //if(!bean.getName().equals("")) {
                    importExcelList.add(bean);
                    //}
                }
                this.saveBatch(importExcelList);
                return BusiResponse.ok("导入成功！");
            }
        }
        return BusiResponse.error("导入失败，原因未知！");
    }


    @Override
    public List<HfEnvCheckTemplateItem> listHandoverCheckItem() {
        QueryWrapper<HfEnvCheckTemplate> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(HfEnvCheckTemplate::getType, CheckTemplateConstant.HANDOVER_TEMPLATE_TYPE);
        List<HfEnvCheckTemplate> checkTemplateList = this.list(queryWrapper);
        if (Objects.isNull(checkTemplateList)) {
            return new ArrayList<>(0);
        } else {
            HfEnvCheckTemplate hfEnvCheckTemplate = checkTemplateList.get(0);
            return HfEnvCheckTemplateItemService.listCheckItemByTemplateId(hfEnvCheckTemplate.getId());
        }
    }
}
